package com.qsw.extendedittext.view;

import android.annotation.SuppressLint;
import android.content.Context;
import android.text.InputFilter;
import android.text.Spanned;
import android.text.TextUtils;
import android.util.AttributeSet;
import android.widget.EditText;

import java.util.Locale;
import java.util.regex.Pattern;

/**
 * 只能输入Integer的EditText
 */
@SuppressLint("AppCompatCustomView")
public class EditTextIntegerInput extends EditText {
    public EditTextIntegerInput(Context context) {
        super(context);
        init();
    }

    public EditTextIntegerInput(Context context, AttributeSet attrs) {
        super(context, attrs);
        init();
    }

    public EditTextIntegerInput(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init();
    }

    public EditTextIntegerInput(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
        super(context, attrs, defStyleAttr, defStyleRes);
        init();
    }

    private void init() {
        InputFilter[] otherFilters = getFilters();
        InputFilter[] newFilters = new InputFilter[]{mNumberInputFilter, mValueInputFilter};
        if (otherFilters != null && otherFilters.length > 0) {
            InputFilter[] currFilters = new InputFilter[otherFilters.length + newFilters.length];
            System.arraycopy(otherFilters, 0, currFilters, 0, otherFilters.length);
            System.arraycopy(newFilters, 0, currFilters, otherFilters.length, newFilters.length);
            setFilters(currFilters);
        } else {
            setFilters(newFilters);
        }
    }

    private final InputFilter mNumberInputFilter = new InputFilter() {
        final Pattern pattern = Pattern.compile("([0-9]|-)*");

        /**
         *
         * @param source 新输入的内容
         * @param start 新输入内容起始位置
         * @param end 新输入内容结束位置
         * @param dest 原来的内容
         * @param dstart 待输入位置光标起点
         * @param dend 待输入位置光标终点
         * @return null：不做任何过滤和转换，输入什么就是什么；""：将source替换为空，也就是不允许任何输入；返回具体内容：将source替换为具体内容
         */
        @Override
        public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
            String sourceStr = source.toString();
            if (sourceStr.contains("E") || sourceStr.contains("e")) {
                try {
                    int value = Integer.parseInt(sourceStr);
                    if (TextUtils.isEmpty(dest)) {
                        return String.format(Locale.getDefault(), "%d", value);
                    } else {
                        return "";
                    }
                } catch (NumberFormatException e) {
                    return "";
                }
            }
            if (!pattern.matcher(source).matches()) {
                // 不匹配数字字符，不符合输入规则
                return "";
            }
            String destStr = dest.toString();
            if ((destStr.substring(0, dstart) + sourceStr.substring(start, end) + destStr.substring(dend, dest.length()))
                    .lastIndexOf("-") > 0) {
                // 负号不在首位，不符合输入规则
                return "";
            }
            return null;
        }
    };

    private final InputFilter mValueInputFilter = new InputFilter() {
        /**
         *
         * @param source 新输入的内容
         * @param start 新输入内容起始位置
         * @param end 新输入内容结束位置
         * @param dest 原来的内容
         * @param dstart 待输入位置光标起点
         * @param dend 待输入位置光标终点
         * @return null：不做任何过滤和转换，输入什么就是什么；""：将source替换为空，也就是不允许任何输入；返回具体内容：将source替换为具体内容
         */
        @Override
        public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
            String destStr = dest.toString();
            String resultStr = destStr.substring(0, dstart) + source.toString().substring(start, end) + destStr.substring(dend, dest.length());

            if (!TextUtils.isEmpty(resultStr)) {
                try {
                    Integer.parseInt(resultStr);
                } catch (NumberFormatException e) {
                    return "";
                }
            }
            return null;
        }
    };
}
